package com.boot.util;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;


/**
 * 日期时间处理格式
 * 
 * @author WanG
 *
 */
public class DateTimeStyle {
	/**
	 * SimpleDateFormat 是非线程安全的
	 * 换一种写法，每次格式化需要新生成一个实例
	 * 
	 */

	/** 标准时间格式 : "yyyy-MM-dd HH:mm:ss" */
	public final static String SIMPLE_NORMAL_DATEFORMATE ="yyyy-MM-dd HH:mm:ss";// 标准时间
	
	public final static String YYYY_MM_DD ="yyyy-MM-dd";// 标准时间

	/** 以前app接口时间格式(没有秒) : "yyyy-MM-dd HH:mm" */
	public final static String SIMPLE_OLD_APP_CHECKTIME_DATEFORMATE ="yyyy-MM-dd HH:mm";
	
	/** 标准时间格式 : "yyyy-MM-dd HH:mm:ss" */
	public final static DateTimeFormatter NORMAL_DATEFORMATE_FULL = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
	/** 标准时间格式(月,日,时,分,秒可以为单数) : "yyyy-M-d H:m:s" */
	public final static DateTimeFormatter NORMAL_DATEFORMATE_SIMPLIFY = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
	
	/**
	 * 两种格式区别
	 * yyyy-MM-dd HH:mm:ss  只能够解析  月,日,时,分,秒为两位数的时间, 
	 * 						也就是个位数前面必须补全0,否则报错(例如:5月 ==> 05月)
	 * 
	 * yyyy-M-d H:m:s  既可以解析月,日,时,分,秒为1位数也可以解析2位数的时间. 
	 * 						不过转化成String的时候不会补全0
	 */
	
	//////////////////////////////////////////////////////////////   双佳相关时间格式     ///////////////////////////////////////////////////////

	/** 双佳measureTime格式  yyyy-M-d H:m:s */
	public final static DateTimeFormatter SHUANGJIA_MEASURETIME_DATEFORMATE = DateTimeFormatter.ofPattern("yyyy-M-d H:m:s");// 双佳measureTime格式
	public final static String SIMPLE_SHUANGJIA_MEASURETIME_DATEFORMATE = "yyyy-MM-dd HH:mm:ss";
	/** 新瑞时measureTime格式  yyyy-MM-dd HH:mm*/
	public final static String SIMPLE_NEWREACH_MEASURETIME_DATEFORMATE = "yyyy-MM-dd HH:mm";
	
	/** 双佳血氧中的Time格式  yyyy/M/dd HH:mm:ss */
	public final static DateTimeFormatter SHUANGJIA_BO_DATEFORMATE = DateTimeFormatter.ofPattern("yyyy/M/d HH:mm:ss");// 双佳血氧中的Time格式"StartTime": "2016/10/24 15:31:40",

	/**  app请求时间格式(2016123014200772) 格式:yyyyMMddHHmmssss  */
	public final static DateTimeFormatter CIYUN_APP_DATEFORMATE = DateTimeFormatter.ofPattern("yyyyMMddHHmmssnn");// app请求时间格式(2016123014200772) 格式:yyyyMMddHHmmssss
	
	
	public static void main(String[] args) {
		System.out.println(Timestamp.valueOf(LocalDateTime.of(2017, 4, 05, 8, 24)).getTime());
		System.out.println(DateTimeStyle.getNowAsLong());
		System.out.println(DateTimeStyle.toLong(DateTimeStyle.now()));
		System.out.println(DateTimeStyle.toLong(LocalDateTime.now()));
		System.out.println(new Date().getTime());
		
		System.out.println(LocalDateTime.of(2017, 3, 20, 12, 30).toInstant(ZoneOffset.UTC));
		System.out.println(DateTimeStyle.format(1188076160000L, DateTimeStyle.SIMPLE_NORMAL_DATEFORMATE));
	}
	
	/**
	 * 计算两个LocalDateTime的间隔时间<br>
	 *
	 * @author： WanG
	 * @日期：2016年12月27日 下午2:10:25
	 * @param sDateTime
	 * @param eDateTime
	 * @return
	 */
	public static String localDatetimeToStirng(LocalDateTime sDateTime, LocalDateTime eDateTime) {
		LocalDate startDateInclusive = sDateTime.toLocalDate();
		LocalDate endDateExclusive = eDateTime.toLocalDate();
		Period between = Period.between(startDateInclusive, endDateExclusive);
		
		int year = between.getYears();
		int month = between.getMonths();
		int day = between.getDays();
		int hour = eDateTime.getHour() - sDateTime.getHour();
		int minute = eDateTime.getMinute() - sDateTime.getMinute();
		int second = eDateTime.getSecond() - sDateTime.getSecond();
		int nano = eDateTime.getNano() - sDateTime.getNano();
		long milliSecond = nano / 1000000;
		
		return buildIntervalString(year, month, day, hour, minute, second, milliSecond);
	}
	
	/**
	 * 计算两个localTime中的间隔时间
	 *
	 * @author： WanG
	 * @日期：2016年12月27日 下午1:53:46
	 * @param sTime
	 * @param eTime
	 * @return
	 */
	public static String localTimeToStirng(LocalTime sTime, LocalTime eTime) {
		
		long hour = eTime.getHour() - sTime.getHour();
		long minute = eTime.getMinute() - sTime.getMinute();
		long second = eTime.getSecond() - sTime.getSecond();
		long nano = eTime.getNano() - sTime.getNano();
		long milliSecond = nano / 1000000;
		
		return buildIntervalString(0l, 0l, 0l, hour, minute, second, milliSecond);
	}
	
	/**
	 * 将毫秒时间格式化成字符串显示
	 *
	 * @author： WanG
	 * @日期：2016年12月27日 下午1:48:51
	 * @param ms
	 * @return
	 */
	public static String longToString(long ms) {

		final Integer ss = 1000;
		final Integer mi = ss * 60;
		final Integer hh = mi * 60;
		final Integer dd = hh * 24;

		Long day = ms / dd;
		Long hour = (ms - day * dd) / hh;
		Long minute = (ms - day * dd - hour * hh) / mi;
		Long second = (ms - day * dd - hour * hh - minute * mi) / ss;
		Long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss;

		return buildIntervalString(0l, 0l, day, hour, minute, second, milliSecond);
	
	}
	
	/**
	 * 构造间隔时间字符串
	 *
	 * @author： WanG
	 * 
	 * @日期：2016年12月27日 下午1:56:24
	 */
	private static String buildIntervalString(long year, long mounth, long day, long hour, long minute, long second, long milliSecond) {
		StringBuffer sb = new StringBuffer();
		if (year > 0) {
			sb.append(day + "年");
		}
		if (mounth > 0) {
			sb.append(day + "月");
		}
		if (day > 0) {
			sb.append(day + "天");
		}
		if (hour > 0) {
			sb.append(hour + "小时");
		}
		if (minute > 0) {
			sb.append(minute + "分");
		}
		if (second > 0) {
			sb.append(second + "秒");
		}
		if (milliSecond > 0) {
			sb.append(milliSecond + "毫秒");
		}
		return sb.toString();

	}
	
	/**
	 * 将 LocalDateTime 转化为 Date
	 *
	 * @author： WanG
	 * @日期：2016年12月20日 下午3:07:18
	 * @param localDateTime
	 * @return
	 */
	public static Date toDate(LocalDateTime localDateTime){
		ZoneId zone = ZoneId.systemDefault();
		Instant instant = localDateTime.atZone(zone).toInstant();
		return Date.from(instant);
	}
	
	/**
	 * long类型转化为LocalDateTime类型
	 *
	 * @author： WanG
	 * @日期：2017年1月9日 下午3:50:35
	 * @param time
	 * @return
	 */
	public static LocalDateTime toLocalDateTime(Long time){
		LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault());
		return dateTime;
	}
	
	/**
	 * 展示当前时间(标准格式  年月日 时分秒  yyyy-MM-dd HH:mm:ss)
	 *
	 * @author： WanG
	 * @日期：2017年1月11日 下午3:28:42
	 * @return
	 */
	public static String showTime(){
		return LocalDateTime.now().format(NORMAL_DATEFORMATE_FULL);
	}
	
	/**
	 * 格式话long类型的日期，按传入格式
	 * 返回格式话后的时间字符串
	 *
	 * @author： WanG
	 * @日期：2017年3月23日 下午3:28:16
	 * @param time
	 * @param pattern
	 * @return
	 */
	public static String format(long time , String pattern) {
		Date date = new Date(time);
		return format(date, pattern);
	}
	
	/**
	 * 格式化日期，按传入格式
	 * 返回格式话后的时间字符串
	 *
	 * @author： WanG
	 * @日期：2017年3月23日 下午3:27:46
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static String format(Date date , String pattern) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
		return simpleDateFormat.format(date);
	}
	
	/**
	 * 将localdate格式化，按传入格式
	 * 返回格式话后的时间字符串
	 *
	 * @author： WanG
	 * @日期：2017年3月30日 下午6:09:57
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static String format(LocalDateTime date , String pattern) {
		long time = Timestamp.valueOf(date).getTime();
		return format(time, pattern);
	}
	
	/**
	 * 将字符串转为date
	 *
	 * @author： WanG
	 * @日期：2017年3月23日 下午4:20:58
	 * @param date
	 * @param pattern
	 * @return
	 * @throws ParseException 
	 */
	public static Date convertStringToDate(String date, String pattern) throws ParseException {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
		return simpleDateFormat.parse(date);
	}
	
	/**
	 * 传入两个字符串型时间
	 * 和时间格式
	 * 返回时间差(天数)
	 *
	 * @author： WanG
	 * @日期：2017年3月30日 下午6:45:23
	 * @param endtime
	 * @param strtime
	 * @param type
	 * @return
	 */
	public static long getQuot(String endtime, String strtime, String type) {
		long quot = 0;
		SimpleDateFormat ft = new SimpleDateFormat(type);
		try {
			Date date1 = ft.parse(endtime);
			Date date2 = ft.parse(strtime);
			quot = date1.getTime() - date2.getTime();
			quot = quot / 1000 / 60 / 60 / 24;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return quot;
	}
	
	/**
	 * 将 LocalDataTime 转化 为 Long 类型
	 *
	 * @author： WanG
	 * @日期：2017年4月12日 下午1:50:54
	 * @param localDateTime
	 * @return
	 */
	public static long toLong(LocalDateTime localDateTime){
		Timestamp timestamp = Timestamp.valueOf(localDateTime);
		return timestamp.getTime();
	}
	
	/**
	 * 取得当前时间, long类型
	 *
	 * @author： WanG
	 * @日期：2017年4月12日 下午1:57:53
	 * @return
	 */
	public static long getNowAsLong(){
		return toLong(LocalDateTime.now());
	}
	
	/**
	 * 取得当前时间,LocalDateTime类型
	 *
	 * @author： WanG
	 * @日期：2017年4月12日 下午1:58:50
	 * @return
	 */
	public static LocalDateTime now(){
		return LocalDateTime.now();
	}
	
	/**
	 * 将long类型时间转化为标准的时间字符串
	 *
	 * @author： WanG
	 * @日期：2017年4月19日 上午9:16:25
	 * @param ms
	 * @return
	 */
	public static String ParseLong(long ms){
		return ParseLong(ms, NORMAL_DATEFORMATE_FULL);
	}
	
	/**
	 * long类型转为传入的格式字符串
	 *
	 * @author： WanG
	 * @日期：2017年4月19日 上午9:16:52
	 * @param ms
	 * @param formatter
	 * @return
	 */
	public static String ParseLong(long ms, DateTimeFormatter formatter ){
		LocalDateTime localDateTime = toLocalDateTime(ms);
		return localDateTime.format(formatter);
	}
	
	/**
	 * 持续时间
	 *
	 * @author： WanG
	 * @日期：2017年4月30日 下午10:50:05
	 * @param ms
	 * @param formatter
	 * @return
	 */
	public static String duration (LocalDateTime startTime){
		return "----一共用时:"+localDatetimeToStirng(startTime, now());
	}
}
